// https://www.acwing.com/problem/content/837/

#include <iostream>
#include <string>

using namespace std;

// 前缀树（trie）的模板题
// 在 1 解法的基础上做了调整，使用结构体的方法实现，希望能够降低理解难度
// 但是带来的新的问题是引入了指针，注意引用的时候添加 & 符号
// 在方法 1 中，通过存储下一个结点的索引来表示地址，这里我们直接存储地址
// 并且结构体中添加 cnt 字段，用来记录以当前结点字符结尾的字符串的数目。
// 为了降低申请空间的时间消耗，直接一次性申请存储空间（nodes）
// 然后借助 idx 记录内存申请情况。

struct TrieNode {
    TrieNode* children[26] = {};
    int cnt = 0;
};

const int MAX_ARRAY_SIZE = 1e5 + 5;
TrieNode nodes[MAX_ARRAY_SIZE];
int idx = 0;

void Insert(const string& word) {
    TrieNode* p = &nodes[0];
    for (const char ch: word) {
        int t = ch - 'a';
        if (!p->children[t]) {
            p->children[t] = &nodes[++idx];
        }
        p = p->children[t];
    }
    p->cnt++;
}

int Query(const string& word) {
    TrieNode* p = &nodes[0];
    for (const char ch: word) {
        int t = ch - 'a';
        if (!p->children[t]) {
            return 0;
        }
        p = p->children[t];
    }
    return p->cnt;
}

int main() {
    int n;
    char ch;
    string word;
    cin>>n;
    for (int i=0; i<n; i++) {
        cin>>ch>>word;
        if (ch == 'I') {
            Insert(word);
        } else if (ch == 'Q') {
            cout<<Query(word)<<endl;
        }
    }
    return 0;
}
